
<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <title>NESASM</title>
    <style>
    html,body{font-size:14px; color:#444;} 
    a {text-decoration: none; color:blue;}
    a:hover{color:red;}
    .main{margin:0 auto; width:960px;}
    .box{border:1px solid #eee;}
    </style>
</head>

<body>

<div class="main">
<p>【啥？】
</p><p>今天不是教程，更像是前天留的作业的解决方案，即用手柄控制主角运动。我相信我们实际上已经掌握了所有必要的技能。下面给出完整代码。
</p><p>【代码】
</p><p>    ;;--- 代码开始 ---;;
</p><p>    .inesprg 1
</p><p>    .inesmap 0
</p><p>    .inesmir 1
</p><p>    .ineschr 1
</p><p>    .bank 1     
</p><p>    .org $FFFA
</p><p>    .dw 0        ; 
</p><p>    .dw Start    ; 复位向量
</p><p>    .dw 0        ; 
</p><p>    .bank 0
</p><p>    .org $0000
</p><p>X_Pos   .db 20       ; 主角X坐标
</p><p>Y_Pos   .db 20       ; 主角Y坐标
</p><p>    .org $8000  ; 
</p><p>Start:
</p><p>    lda #%00001000  ;
</p><p>    sta $2000       ; 
</p><p>    lda #%00011110  ; 典型的PPU设置代码
</p><p>    sta $2001       ; 
</p><p>    ldx #$00    ; 清零X            ;; 开始载入调色板
</p><p>    lda #$3F    ; 
</p><p>    sta $2006   ; 
</p><p>    lda #$00    ; 
</p><p>    sta $2006
</p><p>loadpal:                ; 
</p><p>    lda tilepal, x  ; 
</p><p>    sta $2007       ; 
</p><p>    inx             ; 
</p><p>    cpx #32         ; 
</p><p>    bne loadpal     ; 
</p><p>                                    ;; 载入调色板结束
</p><p>infinite:  ; 死循环
</p><p>waitblank:         
</p><p>    lda $2002  ; 
</p><p>    bpl waitblank ; 等待VBlank
</p><p>    lda #$00   ; 开始写SPR-RAM
</p><p>    sta $2003  ; 
</p><p>    lda #$00   ; 
</p><p>    sta $2003  ; 
</p><p>    lda Y_Pos  ; 
</p><p>    sta $2004 ; 纵坐标
</p><p>    lda #$00  ; 
</p><p>    sta $2004 ; tile编号0
</p><p>    lda #$00 ; 
</p><p>    sta $2004 ;
</p><p>    lda X_Pos  ;
</p><p>    sta $2004 ; 横坐标
</p><p>    ; 务必注意顺序
</p><p>    lda #$01   ; 
</p><p>    sta $4016  ;
</p><p>    lda #$00   ;
</p><p>    sta $4016  ; 设置/选通手柄
</p><p>    lda $4016  ; A
</p><p>    lda $4016  ; B
</p><p>    lda $4016  ; Select
</p><p>    lda $4016  ; Start
</p><p>    lda $4016  ; UP
</p><p>    and #1     ; 
</p><p>    bne UPKEYdown  ; 
</p><p>    ;如果按下“UP”，跳转到UPKEYdown
</p><p>    lda $4016  ; DOWN 
</p><p>    and #1     ; 
</p><p>    bne DOWNKEYdown
</p><p>    lda $4016  ; LEFT 
</p><p>    and #1     ; 
</p><p>    bne LEFTKEYdown
</p><p>    lda $4016  ; RIGHT 
</p><p>    and #1     ; 
</p><p>    bne RIGHTKEYdown
</p><p>    jmp NOTHINGdown  ; 没有按键按下，跳到NOTHINGdown
</p><p>UPKEYdown:
</p><p>    lda Y_Pos ; 将Y坐标载入A
</p><p>    sbc #1  ; 减1
</p><p>    sta Y_Pos ; 保存
</p><p>    jmp NOTHINGdown  ; 处理结束
</p><p>DOWNKEYdown:
</p><p>    lda Y_Pos 
</p><p>    adc #1  ; Y坐标加1
</p><p>    sta Y_Pos
</p><p>    jmp NOTHINGdown ; 
</p><p>LEFTKEYdown:
</p><p>    lda X_Pos
</p><p>    sbc #1  
</p><p>    sta X_Pos
</p><p>    jmp NOTHINGdown 
</p><p>;左键按下，X坐标减1
</p><p>RIGHTKEYdown:
</p><p>    lda X_Pos
</p><p>    adc #1
</p><p>    sta X_Pos
</p><p>    ; 右键按下，X坐标加1
</p><p>NOTHINGdown:
</p><p>    jmp infinite
</p><p>tilepal:   .incbin "our.pal"  ; 
</p><p>    .bank 2
</p><p>    .org $0000
</p><p>    .incbin "our.bkg"
</p><p>    .incbin "our.spr"
</p><p>;;--- 代码结束 ---;;
</p><p>希望你还保存着第五天的our.pal, our.bkg, our.spr文件。你应该理解所有这些必要的内容。
</p><p>注意：在一些模拟器上你可能得按下好几次按钮，主角才出现。我不知道为啥。
</p><p>【今日回顾】
</p><p>感谢那些发给我运动主角代码的人，至少我知道有人读了我的教程。
</p></div>
</body>
</html>
